package br.com.tiespec.web.ManagedBean;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.tiespec.ejb.EjbInterface.ArtefatoInterface;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.Anexo;
import br.com.tiespec.model.Modelo.Artefato;
import br.com.tiespec.model.Modelo.Documento;
import br.com.tiespec.model.Modelo.Projeto;
import br.com.tiespec.web.Util.InitUtil;
import br.com.tiespec.web.Util.MsgUtil;
import br.com.tiespec.web.Util.WebUtil;

@Named("artefatoBean")
@SessionScoped
public class ArtefatoBean implements Serializable {

	private static final long serialVersionUID = 1195465736107136284L;

	@EJB private ArtefatoInterface ejb;
	
	private Artefato artefatoInstance;
	private Artefato artefatoInstanceTemp;
	private LazyDataModel<Artefato> artefatoList;
	
	private LazyDataModel<Anexo> anexoLazyList;
	private LazyDataModel<Documento> documentoLazyList;
	
	private Long idClientePortal;
	
	private String varBuscaNome;
	private String varBuscaProjeto;
	private String varBuscaDescricao;
	
	private String varProjetoCodigo;
	private String varProjetoNome;
	private String varProjetoCliente;
	
	private Documento documentoInstance;
	private Anexo anexoInstance;
	
	private Anexo[] anexoSelecionados;
	private Documento[] documentoSelecionados;
	
	private LazyDataModel<Projeto> projetoList;
	private Projeto projetoInstance;
	
	private String varAnexoNome;
	private String varDocumentoNome;
	
	private String msgExclusao;
	
	public String artefato(){
		init();
		return "/views/artefato/show.xhtml";
	}
	
	@PostConstruct
	public void init(){
		artefatoInstance = new Artefato();
		artefatoInstanceTemp = new Artefato();
		artefatoList = InitUtil.inicializaArtefatoList();
	}
	
	public String goCreate(){
		artefatoInstance = new Artefato();
		artefatoInstance.setResponsavel(WebUtil.getUsuarioLogado());
		return "/views/artefato/create.xhtml";
	}
	
	public String salvarArtefato(){
		try {
			artefatoInstance.setDataHoraCriacao(new Date());
			ejb.salvarArtefato(artefatoInstance);
			MsgUtil.msgSucesso("inc", artefatoInstance.getNome());
			return "/views/artefato/show.xhtml";
		} catch (Exception e){
			e.printStackTrace();
			MsgUtil.msgErro("inc", artefatoInstance.getNome());
			return null;
		}
	}
	
	public String goCancel(){
		return "/views/artefato/show.xhtml";
	}
	
	public String goEdit(){
		artefatoInstance = ejb.selecionarArtefatoCompleto(artefatoInstance.getId());
		return "/views/artefato/edit.xhtml";
	}
	
	public String atualizarArtefato(){
		try {
			artefatoInstance.setResponsavel(WebUtil.getUsuarioLogado());
			ejb.atualizarArtefato(artefatoInstance);
			MsgUtil.msgSucesso("atu", artefatoInstance.getNome());
			return "/views/artefato/show.xhtml";
		} catch (Exception e){
			e.printStackTrace();
			MsgUtil.msgErro("atu", artefatoInstance.getNome());
			return null;
		}
	}
	
	@SuppressWarnings("serial")
	public void filtrarArtefato(){
		artefatoList = new LazyDataModel<Artefato>() {
			@Override
			public List<Artefato> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				WebUtil.setDataTableRows(pageSize);
				return ejb.listarArtefato(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), idClientePortal, varBuscaNome, varBuscaProjeto, varBuscaDescricao);
			}
			@Override  
	        public Artefato getRowData(String rowKey) {  
	        	try {
		            return ejb.selecionarArtefato(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Artefato();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Artefato objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		artefatoList.setRowCount(ejb.countArtefato(idClientePortal, varBuscaNome, varBuscaProjeto, varBuscaDescricao));
		artefatoList.setPageSize(5);
	}
	
	public void selecionarArtefato(){
		if (artefatoInstanceTemp != null && artefatoInstanceTemp.getId() != null){
			artefatoInstance = ejb.selecionarArtefatoComUsuarioEProjeto(artefatoInstanceTemp.getId());
			filtrarAnexo();
			filtrarDocumento();
		}
	}
	
	public void cancelarSelecionarArtefato(){
		varBuscaDescricao = null;
		varBuscaNome = null;
		varBuscaProjeto = null;
		artefatoList = InitUtil.inicializaArtefatoList();
	}
	
	@SuppressWarnings("serial")
	public void filtrarAnexo(){
		anexoLazyList = new LazyDataModel<Anexo>() {
			@Override
			public List<Anexo> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				WebUtil.setDataTableRows(pageSize);
				return ejb.listarAnexo(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), artefatoInstance.getId(), varAnexoNome);
			}
			@Override  
	        public Anexo getRowData(String rowKey) {  
	        	try {
		            return ejb.selecionarAnexo(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Anexo();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Anexo objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		anexoLazyList.setRowCount(ejb.countAnexo(artefatoInstance.getId(), varAnexoNome));
		anexoLazyList.setPageSize(5);
	}
	
	public void preCreateAnexo(){
		anexoInstance = new Anexo();
		anexoInstance.setArtefato(artefatoInstance);
	}
	
	public void criarAnexo(){
		try {
			ejb.salvarAnexo(anexoInstance);
			MsgUtil.msgSucesso("inc", anexoInstance.getNome());
		} catch (Exception e){
			e.printStackTrace();
			MsgUtil.msgErro("inc", anexoInstance.getNome());
		}
	}
	
	public void preExcluirAnexos(){
		RequestContext contexto = RequestContext.getCurrentInstance();
		Integer size = anexoSelecionados.length;
		if (size == 0){
			contexto.execute("dialogoSelecione.show();");
			return;
		}
		if (size == 1){
			for (Anexo a: anexoSelecionados){
				msgExclusao = MsgUtil.getMensagem("DialogoExcluir_MensagemUnico", a.getNome());
			}
		} else {
			String msg = "";
			Integer count = 0;
			for (Anexo a:anexoSelecionados){
				msg += "'" + a.getNome() + "'";
				count++;
				if (count==(size-1))
					msg += " e ";
				else if (count != size)
					msg += ", ";
			}
			msgExclusao = MsgUtil.getMensagem("DialogoExcluir_MensagemMultiplo", msg);
		}
		contexto.execute("dialogoExcluirAnexo.show();");
	}
	
	public void excluirAnexo(){
		for (Anexo a:anexoSelecionados){
			try {
				ejb.excluirAnexo(a.getId());
				MsgUtil.msgSucesso("exc", a.getNome());
			} catch (Exception e){
				e.printStackTrace();
				MsgUtil.msgErro("exc", a.getNome());
			}
		}
	}
	
	@SuppressWarnings("serial")
	public void filtrarDocumento(){
		documentoLazyList = new LazyDataModel<Documento>() {
			@Override
			public List<Documento> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				WebUtil.setDataTableRows(pageSize);
				return ejb.listarDocumento(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), artefatoInstance.getId(), varDocumentoNome);
			}
			@Override  
	        public Documento getRowData(String rowKey) {  
	        	try {
		            return ejb.selecionarDocumento(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Documento();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Documento objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		documentoLazyList.setRowCount(ejb.countDocumento(artefatoInstance.getId(), varDocumentoNome));
		documentoLazyList.setPageSize(5);
	}
	
	public void preCreateDocumento(){
		documentoInstance = new Documento();
		documentoInstance.setArtefato(artefatoInstance);
	}
	
	public void criarDocumento(){
		try {
			ejb.salvarDocumento(documentoInstance);
			MsgUtil.msgSucesso("inc", documentoInstance.getNome());
		} catch (Exception e){
			e.printStackTrace();
			MsgUtil.msgErro("inc", documentoInstance.getNome());
		}
	}
	
	public void preExcluirDocumentos(){
		RequestContext contexto = RequestContext.getCurrentInstance();
		Integer size = documentoSelecionados.length;
		if (size == 0){
			contexto.execute("dialogoSelecione.show();");
			return;
		}
		if (size == 1){
			for (Documento a: documentoSelecionados){
				msgExclusao = MsgUtil.getMensagem("DialogoExcluir_MensagemUnico", a.getNome());
			}
		} else {
			String msg = "";
			Integer count = 0;
			for (Documento a:documentoSelecionados){
				msg += "'" + a.getNome() + "'";
				count++;
				if (count==(size-1))
					msg += " e ";
				else if (count != size)
					msg += ", ";
			}
			msgExclusao = MsgUtil.getMensagem("DialogoExcluir_MensagemMultiplo", msg);
		}
		contexto.execute("dialogoExcluirDocumento.show();");
	}
	
	public void excluirDocumento(){
		for (Documento d:documentoSelecionados){
			try {
				ejb.excluirDocumento(d.getId());
				MsgUtil.msgSucesso("exc", d.getNome());
			} catch (Exception e){
				e.printStackTrace();
				MsgUtil.msgErro("exc", d.getNome());
			}
		}
	}
	
	@SuppressWarnings("serial")
	public void filtrarProjeto(){
		projetoList = new LazyDataModel<Projeto>() {
			@Override
			public List<Projeto> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				WebUtil.setDataTableRows(pageSize);
				return ejb.listarProjeto(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), idClientePortal, varProjetoCodigo, varProjetoNome, varProjetoCliente);
			}
			@Override  
	        public Projeto getRowData(String rowKey) {  
	        	try {
		            return ejb.selecionarProjeto(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Projeto();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Projeto objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		projetoList.setRowCount(ejb.countProjeto(idClientePortal, varProjetoCodigo, varProjetoNome, varProjetoCliente));
		projetoList.setPageSize(5);
	}
	
	public void selecionarProjeto(){
		artefatoInstance.setProjeto(projetoInstance);
	}
	
	public void cancelarSelecionarProjeto(){
		varProjetoCliente = null;
		varProjetoCodigo = null;
		varProjetoNome = null;
		projetoList = InitUtil.inicializaProjetoList();
	}
	
	public String goHome(){
		this.destroy();
		return "goHome";
	}
	
	@PreDestroy
	public void destroy(){
		artefatoInstance = null;
		artefatoInstanceTemp = null;
		artefatoList = null;
	}

	public Artefato getArtefatoInstance() {
		return artefatoInstance;
	}

	public void setArtefatoInstance(Artefato artefatoInstance) {
		this.artefatoInstance = artefatoInstance;
	}

	public Artefato getArtefatoInstanceTemp() {
		return artefatoInstanceTemp;
	}

	public void setArtefatoInstanceTemp(Artefato artefatoInstanceTemp) {
		this.artefatoInstanceTemp = artefatoInstanceTemp;
	}

	public LazyDataModel<Artefato> getArtefatoList() {
		return artefatoList;
	}

	public void setArtefatoList(LazyDataModel<Artefato> artefatoList) {
		this.artefatoList = artefatoList;
	}
	
	public LazyDataModel<Anexo> getAnexoLazyList() {
		return anexoLazyList;
	}
	
	public void setAnexoLazyList(LazyDataModel<Anexo> anexoLazyList) {
		this.anexoLazyList = anexoLazyList;
	}
	
	public LazyDataModel<Documento> getDocumentoLazyList() {
		return documentoLazyList;
	}
	
	public void setDocumentoLazyList(LazyDataModel<Documento> documentoLazyList) {
		this.documentoLazyList = documentoLazyList;
	}

	public String getVarBuscaNome() {
		return varBuscaNome;
	}

	public void setVarBuscaNome(String varBuscaNome) {
		this.varBuscaNome = varBuscaNome;
	}

	public String getVarBuscaProjeto() {
		return varBuscaProjeto;
	}

	public void setVarBuscaProjeto(String varBuscaProjeto) {
		this.varBuscaProjeto = varBuscaProjeto;
	}

	public String getVarBuscaDescricao() {
		return varBuscaDescricao;
	}

	public void setVarBuscaDescricao(String varBuscaDescricao) {
		this.varBuscaDescricao = varBuscaDescricao;
	}

	public Long getIdClientePortal() {
		return idClientePortal;
	}

	public void setIdClientePortal(Long idClientePortal) {
		this.idClientePortal = idClientePortal;
	}

	public String getVarProjetoCodigo() {
		return varProjetoCodigo;
	}

	public void setVarProjetoCodigo(String varProjetoCodigo) {
		this.varProjetoCodigo = varProjetoCodigo;
	}

	public String getVarProjetoNome() {
		return varProjetoNome;
	}

	public void setVarProjetoNome(String varProjetoNome) {
		this.varProjetoNome = varProjetoNome;
	}

	public String getVarProjetoCliente() {
		return varProjetoCliente;
	}

	public void setVarProjetoCliente(String varProjetoCliente) {
		this.varProjetoCliente = varProjetoCliente;
	}

	public Documento getDocumentoInstance() {
		return documentoInstance;
	}

	public void setDocumentoInstance(Documento documentoInstance) {
		this.documentoInstance = documentoInstance;
	}
	
	public Anexo getAnexoInstance() {
		return anexoInstance;
	}
	
	public void setAnexoInstance(Anexo anexoInstance) {
		this.anexoInstance = anexoInstance;
	}

	public Anexo[] getAnexoSelecionados() {
		return anexoSelecionados;
	}

	public void setAnexoSelecionados(Anexo[] anexoSelecionados) {
		this.anexoSelecionados = anexoSelecionados;
	}

	public Documento[] getDocumentoSelecionados() {
		return documentoSelecionados;
	}

	public void setDocumentoSelecionados(Documento[] documentoSelecionados) {
		this.documentoSelecionados = documentoSelecionados;
	}

	public String getMsgExclusao() {
		return msgExclusao;
	}

	public void setMsgExclusao(String msgExclusao) {
		this.msgExclusao = msgExclusao;
	}
	
	public Projeto getProjetoInstance() {
		return projetoInstance;
	}
	
	public void setProjetoInstance(Projeto projetoInstance) {
		this.projetoInstance = projetoInstance;
	}
	
	public LazyDataModel<Projeto> getProjetoList() {
		return projetoList;
	}
	
	public void setProjetoList(LazyDataModel<Projeto> projetoList) {
		this.projetoList = projetoList;
	}
	
	public String getVarAnexoNome() {
		return varAnexoNome;
	}
	
	public void setVarAnexoNome(String varAnexoNome) {
		this.varAnexoNome = varAnexoNome;
	}
	
	public String getVarDocumentoNome() {
		return varDocumentoNome;
	}
	
	public void setVarDocumentoNome(String varDocumentoNome) {
		this.varDocumentoNome = varDocumentoNome;
	}
}